package biblioteca.model;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import com.mysql.jdbc.PreparedStatement;

/**
 * Classe cuja finalidade e gerenciar o Acervo de itens no Banco de Dados.
 * Atributos: itens, connection, acervo e fileWriter. 
 * @author willen leiros e fabio queiroz
 *
 */
public class GerenciarAcervo {
	private Connection connection;
	private FileWriter fileWriter;
	PreparedStatement stmt;
	
	/**
	 * Construtor da classe que instancia uma conexão com Banco de Dados, inicializa o Acervo
	 * e cria uma lista de itens.
	 */
	
	public GerenciarAcervo(){
		this.connection = new ConnectionFactory().getConnection();
	}
	
	/**
	 * Esse metodo inseri um ItemAcervo no Banco de Dados e registra o Item no log de cadastro de Livros.
	 * 
	 * @param item Parametro do tipo ItemAcervo que representa um objeto item para ser inserido no banco de dados.
	 */
	
	public void addItem(ItemAcervo item){
		String sql = "insert into Item " + "(Acervo_codAcervo,titulo,autor,isbn,edicao,qtdPaginas,situacao)"
				+ " values (?,?,?,?,?,?,?)";

		try {
			PreparedStatement stmt = (PreparedStatement) connection
					.prepareStatement(sql);
			if (item instanceof Livro){
				
				//Esta inserindo 1 - central, para Acervo_codAcervo a implementar para outros Acervos
				stmt.setInt(1, 1);
				stmt.setString(2, item.getTitulo());
				stmt.setString(3, item.getAutor());
				stmt.setString(4, ((Livro) item).getIsbn());
				stmt.setInt(5, (int) ((Livro) item).getEdicao());
				stmt.setInt(6, 0);
				stmt.setString(7, item.getSituacao());
				
				fileWriter = new FileWriter(new File("arquivosDeLog/logCadastroItem.txt"),true); 
				
				String quebra = "\n";
				String linha = "---------------------------";
				
				fileWriter.write(linha);
				
				fileWriter.write(quebra);
				
				fileWriter.write("**Livro**");

				fileWriter.write(quebra);

				fileWriter.write("Titulo: "+item.getTitulo());

				fileWriter.write(quebra);

				fileWriter.write("Autor: "+item.getAutor());
				
				fileWriter.write(quebra);
				
				fileWriter.write("Isbn: "+((Livro) item).getIsbn());
				
				fileWriter.write(quebra);
				
				fileWriter.write("Edição: "+(int) ((Livro) item).getEdicao());

				fileWriter.write(quebra);
				fileWriter.write(linha);
				fileWriter.write(quebra);


				fileWriter.close();
				
				
			}
			else if(item instanceof Apostila){
				//Esta inseririndo 1 para Acervo_codAcervo a implementar para outros Acervos
				stmt.setInt(1, 1);
				stmt.setString(2, item.getTitulo());
				stmt.setString(3, item.getAutor());
				stmt.setString(4, null);
				stmt.setInt(5, 0);
				stmt.setInt(6, (int) ((Apostila) item).getQtdPaginas());
				stmt.setString(7, item.getSituacao());
				
				fileWriter = new FileWriter(new File("arquivosDeLog/logCadastroItem.txt"),true); 
				
				String quebra = "\n";
				String linha = "---------------------------";
				
				fileWriter.write(linha);
				
				fileWriter.write(quebra);

				fileWriter.write("**Apostila**");

				fileWriter.write(quebra);
				
				fileWriter.write("Titulo: "+item.getTitulo());

				fileWriter.write(quebra);

				fileWriter.write("Autor: "+item.getAutor());
				
				fileWriter.write(quebra);
				
				fileWriter.write("Qtd de páginas: "+(int) ((Apostila) item).getQtdPaginas());

				fileWriter.write(quebra);
				fileWriter.write(linha);
				fileWriter.write(quebra);


				fileWriter.close();
				
			}
			

			stmt.execute();
			stmt.close();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		} catch (IOException e) { 
			e.printStackTrace();
		}
		
	}
	
	/**
	 * Esse metodo deleta um Item no banco de dados.
	 * @param item Parametro do tipo ItemAcervo que representa um objeto item para ser deletado do Banco de Dados.
	 */
	
	public void deleteItem(ItemAcervo item){

		try {
			PreparedStatement stmt = (PreparedStatement) connection
					.prepareStatement("delete from Item where codItem=?");
			stmt.setLong(1, item.getCodItem());
			stmt.execute();
			stmt.close();
		} catch (SQLException e) {
			throw new RuntimeException(e);

		}
	}
	
	/**
	 * Esse Metodo retorna uma lista de todos os Itens do Avervo
	 * @return itens
	 */
	
	public ArrayList<ItemAcervo> listarItens(){
		try {
			ArrayList<ItemAcervo> itens = new ArrayList<ItemAcervo>();
			stmt = (PreparedStatement) this.connection
					.prepareStatement("select * from Leiros01.Item");
		
			ResultSet rs = stmt.executeQuery();

			while (rs.next()) {
				
				if (rs.getString("isbn") != null){
					Livro livro = new Livro();
					livro.setCodItem(rs.getLong("codItem"));
					livro.setTitulo(rs.getString("titulo"));
					livro.setAutor(rs.getString("autor"));
					livro.setIsbn(rs.getString("isbn"));
					livro.setEdicao(rs.getLong("edicao"));
					livro.setSituacao(rs.getString("situacao"));
					itens.add(livro);
				}else{
					Apostila apostila = new Apostila();
					apostila.setCodItem(rs.getLong("codItem"));
					apostila.setTitulo(rs.getString("titulo"));
					apostila.setAutor(rs.getString("autor"));
					apostila.setQtdPaginas(rs.getInt("qtdPaginas"));
					apostila.setSituacao(rs.getString("situacao"));
					itens.add(apostila);
				}
				
			}
			rs.close();
			stmt.close();
			return itens;

		} 
		catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}	
}
